﻿using LuaInterface;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CallLua : MonoBehaviour {

    LuaState lua = null;
    LuaFunction func = null;
    public TextAsset text;

	void Start () {
        lua = new LuaState();
        lua.Start();
        //lua.DoString(text.text);
        string fullPath = Application.dataPath + "\\Scripts/Lua";
        lua.AddSearchPath(fullPath);
        lua.DoFile("luaScripts.lua");

        //调用lua对象的变量///
        var num = lua["test.num"];
        Debug.Log("lua里的变量num=:" + num);

        //也可以直接获取LuaTable:///
        LuaTable t1 = (LuaTable)lua["test"];
        Debug.Log(t1["num"]);
        //如果使用LuaTable,记得释放内存
        t1.Dispose();

        func = lua.GetFunction("test.TestCall");
        //以下是2种方法调试形式，前者的lua对象占用的内存无法被自动释放；
        //但是可以调用func.Dispose()方法，释放掉垃圾内存，否则会造成内存泄漏。
        //而后者则不用担心GC释放的问题
        if(func!=null)
        {
            //有gc alloc 
            func.Call();

            int num1 = func.Invoke<int, int>(123456);
            Debugger.Log("generic call return: {0}", num1);

            string str = func.Invoke<string, string>("kerven");
            Debug.Log(str);
            
            string s = CallFunc();
            Debug.Log(s);

            num1 = CallFuncInt();
            Debug.Log(num1);

            func.Call();

            func.Call();
        }
	}
	
    string CallFunc()
    {
        func.BeginPCall();
        //给方法传参
        func.Push("女右");
        //通过func.Checkxxx()方法获得lua脚本里的返回值。
        string s = func.CheckString();
        //运行
        func.PCall();
        func.EndPCall();
        return s;
    }
    int CallFuncInt()
    {
        func.BeginPCall();
        func.Push(666);
        int num = (int)func.CheckNumber();
        func.PCall();
        func.EndPCall();
        return num;
    }
}
